/**
 * Processador de Arquivos
 *
 * Realiza o processo de leitura no bando de dados e gravação de dados de um
 * determinado diretório
 */
package epibot.testeProteinas;

import epibot.BancoDeDados.Tabelas;
import epibot.EstruturasBiologicas.Epitopo;
import epibot.EstruturasBiologicas.Proteina;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import javax.swing.JOptionPane;

/**
 *
 * @author Rafael Tosta
 */
public class ProcessadorDeArquivos {

    /*
     * Realiza a leitura no bando de dados das proteinas e dos epitopos para o
     * processamento da consolidação e armazena os em formato texto no diretório
     * definido
     *
     * @param f Referência do frame principal
     * @param nomeCalibragem Nome da calibragem
     * @param id_site identificador do site
     * @param size Tamanho do epitopo
     * @param allele Alelo
     * @param stm Conexão com o banco de dados
     *
     * @return Lista de proteínas
     */
    public ArrayList<Proteina> leitura(ArrayList<Proteina> get, String nomeCalibragem, String id_site, String size, String allele) {
        ArrayList<Proteina> listaDeProteinas = new ArrayList<Proteina>();

        // pega a nota do site informado pelo id_site
        String notaDoSite = Tabelas.getTabelaNotaDoSite().getNota(nomeCalibragem, id_site);
        //Pega o nome do site
        String nomeDoSite = Tabelas.getTabelaSites().getNome(id_site);

        Double maxRank = 0.0;
        Double minRank = 0.0;
        int t = 0;
        boolean flag = true;

        // armazena um proteina e todos os seus epitopos  
        for (int i = 0; i < get.size(); i++) { //varia a proteina
            Proteina get1 = get.get(i);
            ArrayList<Epitopo> le = get1.getListaDeEpitopos();

            String cabecalho = get1.getCabecalho();

            for (int j = 0; j < le.size(); j++) {//varia o epitopo

                String codProteina = get1.getCodProteina();
                String epitopo = le.get(j).getNomeEpitopo();
                double scoreEpitopo = le.get(j).getScoreAbsoluto();

                //posição do epitopo na proteina
                int posicao = le.get(j).getPosicao(); //Tabelas.getTabelaEpitopos().getPosicao(codProteina, epitopo, allele,
                //size, id_site, stm);

                //obtem o valor maximo dw score desse site
                if (maxRank < scoreEpitopo) {
                    maxRank = scoreEpitopo;
                }
                //obtem o valor minimo do rank desse site
                if (minRank > scoreEpitopo) {
                    minRank = scoreEpitopo;
                }
                //verifica se a proteina já existe na lista
                int index = this.existProteina(codProteina, listaDeProteinas);
                if (index == -1) { //não encontrou
                    //cria uma nova proteina e adiciona na lista
                    listaDeProteinas.add(
                            new Proteina(codProteina, nomeDoSite, allele, size, Double.parseDouble(notaDoSite), cabecalho));
                    t++;
                    index = this.existProteina(codProteina, listaDeProteinas);
                }

                //Cria um objeto Epitopo e armazena na lista da proteina
                Epitopo ep = new Epitopo(epitopo, posicao, scoreEpitopo, listaDeProteinas.get(index));
                listaDeProteinas.get(index).addEpitopo(ep);
               
            }
        }

        if (flag) {
            t = 0;
            flag = false;
        }
        //atualiza o rank maximo e minimo de todos os epitopos de um site

        for (int i = t;
                i < listaDeProteinas.size();
                i++) {
            for (int r = 0; r < listaDeProteinas.get(i).getListaDeEpitopos().size(); r++) {
                listaDeProteinas.get(i).getListaDeEpitopos().get(r).setMaxMinProteina(maxRank, minRank);
            }
        }

        return listaDeProteinas;
    }

    /**
     * Verifica se uma proteina já esta na lista
     *
     * @param codProteina Código da proteína
     * @param p Lista de proteínas
     * @return Retorna o indice da proteína na lista caso se encontrado, caso
     * contrário retorna -1
     */
    private int existProteina(String codProteina, ArrayList<Proteina> p) {
        if (!p.isEmpty()) {
            for (int j = 0; j < p.size(); j++) {
                if (codProteina.equals(p.get(j).getCodProteina())) {
                    return j;
                }
            }
        }
        return -1;
    }

    /**
     * Realiza a gravacao em arquivo dos epitopos ordenados por site
     *
     * @param lista lista de epitopos
     * @param nomeDoArquivo Nome do arquivo
     */
    public void escritaResultados1(ArrayList<Epitopo> lista, File urlSaida, String nomeDoArquivo) {
        try {
            BufferedWriter saida = new BufferedWriter(new FileWriter(urlSaida + File.separator + nomeDoArquivo + ".txt"));

            saida.write("EPITOPE,POSITION,SCORE,NORMALIZED_SCORE,SITE,ALLELE,SIZE,CODE_PROTEIN");
            saida.newLine();

            for (Iterator iterator = lista.iterator(); iterator.hasNext();) {
                Epitopo ep = (Epitopo) iterator.next();
                saida.write(ep.getInformacao());
                saida.newLine();
            }

            saida.close();
        } catch (IOException e) {
            System.out.println("Erro ao gravar o arquivo1\n");
        }
    }

    /**
     * Gera arquivo de resultado do segundo arquivo de resultado
     *
     * @param lista Lista de resultaado global
     */
    public void escritaResultadoGlobal(ArrayList<EpitopoGeral> lista, File urlSaida, String nome) {
        try {
            String url = urlSaida.getPath() + File.separator + nome + ".txt";
            System.out.println(url);
            BufferedWriter saida = new BufferedWriter(new FileWriter(urlSaida + File.separator + nome + ".txt"));

            saida.write("RANK,EPITOPE,POSITION,GLOBAL_SCORE,ALLELE,SIZE,HEADER");
            saida.newLine();

            for (Iterator iterator = lista.iterator(); iterator.hasNext();) {
                EpitopoGeral ep = (EpitopoGeral) iterator.next();
                saida.write(ep.getInformacaoEG());
                saida.newLine();
            }

            saida.close();

        } catch (IOException e) {
            //      System.out.println("Erro ao gravar o arquivo2\n");
            JOptionPane.showMessageDialog(null, "Error writing " + nome + " file! \n" + e.getMessage() + "\n" + e.getLocalizedMessage(), "EPIBOT alert", JOptionPane.ERROR_MESSAGE);
        }

    }
}
